294. Делители
В интервале [L; U] найти число,
которое имеет наибольшее количество делителей.
Вход.
Первая строка содержит количество тестов n.
Каждая из следующих n строк содержит
два числа L и U – границы интервала (1 £ L £ U £ 1000000000, 0 £ U – L £ 10000).
Выход. Для каждого теста вывести число
из интервала [L; U], которое имеет наибольшее количество делителей.
3
1 10
1000 1000
999999900 1000000000
Пример выхода
Between 1 and 10, 6 has a maximum of 4 divisors.
Between 1000 and 1000, 1000 has a maximum of 16 divisors.
Between 999999900 and 1000000000, 999999924 has a maximum of
192 divisors.
разложение на множители + перебор
Следует перебрать все числа
интервала [L; U], для каждого вычислить количество его делителей. Число,
имеющее наибольшее число делителей, вывести на печать.
Если n = , то число n имеет (a1 + 1) * (a2
+ 1) * … * (ak + 1)
делителей.
Функция count_divisors(n) вычисляет количество делителей числа n по выше приведенной формуле.
int count_divisors(int n)
{
int c, i, res=1;
for(i = 2; i <=
(int)sqrt(n); i++)
{
if (n % i
== 0)
{
c = 0;
while(n %
i == 0) n /= i, c++;
res *= (c + 1);
}
}
if (n > 1)
res *= 2;
return res;
}
Основной цикл программы. Читаем
количество тестов tests.
scanf("%d",&tests);
while(tests--)
{
Вводим границы интервала l и u.
scanf("%d
%d",&l,&u);
Для каждого числа i от l
до u вычисляем в переменной c количество его делителей. Максимальное
количество делителей res будет
содержать число n.
res = 0;
for(i = l; i <=
u;i++)
{
c = count_divisors(i);
if (c >
res) res = c, n = i;
}
Выводим результат.
printf("Between
%d and %d, %d has a maximum of %d divisors.\n",l,u,n,res);
}